package cn.vehicle.service.impl;

import cn.vehicle.domains.bo.QueryPermissionBo;
import cn.vehicle.domains.entity.SysPermissionEntity;
import cn.vehicle.exception.VehicleAccessException;
import cn.vehicle.mapper.SysPermissionMapper;
import cn.vehicle.service.SysPermissionService;
import jakarta.annotation.Resource;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 系统权限服务实现类
 * <p>
 * 负责权限数据的持久化操作，包括新增、修改、删除、查询及分页查询。
 * 通过 {@link SysPermissionMapper} 实现与数据库的交互，是 Service 层的核心实现。
 * </p>
 *
 * <p>主要职责：</p>
 * <ul>
 *   <li>封装权限表（sys_permission）的基础增删改查逻辑；</li>
 *   <li>捕获数据库异常并转换为业务异常 {@link VehicleAccessException}；</li>
 *   <li>为业务层（Biz 层）提供数据访问支持。</li>
 * </ul>
 */
@Service
public class SysPermissionServiceImpl implements SysPermissionService {

    @Resource
    private SysPermissionMapper sysPermissionMapper;

    /**
     * 新增权限记录
     *
     * @param sysPermissionEntity 权限实体对象
     * @throws VehicleAccessException 当权限已存在（唯一约束冲突）时抛出
     */
    @Override
    public void addPermission(SysPermissionEntity sysPermissionEntity) {
        try {
            // 执行插入操作，将权限信息写入数据库
            sysPermissionMapper.insertPermission(sysPermissionEntity);
        } catch (DuplicateKeyException e) {
            // 捕获数据库唯一键冲突异常，抛出业务异常提示“权限已存在”
            throw VehicleAccessException.DATE_EXIST.newInstance("权限已存在");
        }
    }

    /**
     * 更新权限信息
     *
     * @param updateEntity 更新的权限实体
     * @throws VehicleAccessException 若更新失败（未匹配到记录）则抛出异常
     */
    @Override
    public void updatePermission(SysPermissionEntity updateEntity) {
        // 执行选择性更新（仅更新非空字段）
        int i = sysPermissionMapper.updatePermissionSelective(updateEntity);
        // 若未更新到任何记录，说明目标权限不存在
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("更新权限未更新到数据");
        }
    }

    /**
     * 删除权限记录
     *
     * @param id 权限主键ID
     * @throws VehicleAccessException 若删除失败（记录不存在）则抛出异常
     */
    @Override
    public void deletePermission(Long id) {
        // 根据主键ID执行删除操作
        int i = sysPermissionMapper.deletePermissionById(id);
        // 删除数量不为1，说明记录不存在或已被删除
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("删除角色未删除到数据");
        }
    }

    /**
     * 查询权限列表
     *
     * @param queryPermissionBo 查询条件封装对象
     * @return 权限实体列表
     */
    @Override
    public List<SysPermissionEntity> selectPermissionList(QueryPermissionBo queryPermissionBo) {
        // 执行条件查询并返回权限列表结果
        return sysPermissionMapper.selectPermissionList(queryPermissionBo);
    }

    /**
     * 根据ID查询权限详情
     *
     * @param id 权限主键ID
     * @return 权限实体对象
     */
    @Override
    public SysPermissionEntity getPermissionById(Long id) {
        // 根据主键ID查询权限信息
        return sysPermissionMapper.selectPermissionById(id);
    }
}
